﻿// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Abilities/Tasks/AbilityTask.h"
#include "TargetDataUnderMouse.generated.h"

//声明一个带1个参数的动态多播代理，参数为鼠标点击位置
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTargetDataUnderMouseDelegate, const FGameplayAbilityTargetDataHandle&, Data);
/**
 * 
 */
UCLASS()
class STARRYSKY_API UTargetDataUnderMouse : public UAbilityTask
{
	GENERATED_BODY()
public:
	/**静态函数创建自己本身的实例，默认传入当前的Ability
	* DisplayName="TargetDataUnderMouse"：设置该节点或属性在蓝图编辑器中的显示名称为“TargetDataUnderMouse”。
	* HidePin="OwningAbility"：表示名为“OwningAbility”的引脚（输入/输出端口）在蓝图中将被隐藏。
	* DefaultToSelf="OwningAbility"：如果未连接“OwningAbility”引脚，则默认使用“Self”（当前对象）作为其值。
	* BlueprintInternalUseOnly="true"：表示该节点或属性仅供蓝图内部使用，不应暴露给最终用户。
	 **/
	UFUNCTION(BlueprintCallable, Category = "Ability|Tasks", meta = (DisplayName="TargetDataUnderMouse" , HidePin = "OwningAbility", DefaultToSelf = "OwningAbility", BlueprintInternalUseOnly = "true"))
	static UTargetDataUnderMouse* CreateTargetDataUnderMouse(UGameplayAbility* OwningAbility);
	
	//绑定的动态多播代理，作为任务的输出引脚，当这个代理发起广播后，就是可以执行到这个引脚了
	UPROPERTY(BlueprintAssignable)
	FTargetDataUnderMouseDelegate ValidData;

private:
	//激活函数，能力任务的执行逻辑
	virtual void Activate() override;
	//客户端发送目标数据到服务器
	void sendMouseCursorData();
	//接收数据回调函数
	void OnTargetDataReplicatedCallback(const FGameplayAbilityTargetDataHandle& DataHandle, FGameplayTag ActivationTag);
};
